객체 지향(Object Oriented)
✒️ 2025-05-22 15:31 내용 수정
멘토씨리즈 자바, 수제비 2024 정보처리기사 필기 5판 1권의 내용을 중심으로 정리
객체 지향(Object-oriented)
컴퓨터 프로그램을 여러 개의 독립된 단위인 객체들의 모임으로 파악하는 패러다임
- 위키백과 객체 지향 프로그래밍
- 컴퓨터 프로그램을 명령어의 목록으로 보는 것에서 여러 개의 독립된 단위(객체)들의 모임으로 파악한다.
- 각 객체는 메시지를 주고받고 데이터를 처리하며, 데이터는 컴퓨터의 메모리에 저장된다.
- 예시 : 스몰토크, C++, C#, JAVA, Pyton, Ruby, ASP, Purl 등등
구성요소
1. 객체(Object)
- 상태를 표현할 수 있고, 속성을 가질 수 있는 모든 것
- 물리적, 추상적으로 자신과 다른 것을 식별 가능한 대상으로, 객체마다 각각의 상태와 식별성을 가진다.
- 객체가 할 수 있는 동작을 행동이라 하며, 행동은 객체의 메서드를 통해 구현된다.
- ex) 각각의 사람, 연필, 내가 사용하는 스마트폰 등
- 클래스(Classes)#객체 상세 참고.
2. 클래스(Class)
- 같은 종류의 집단에 속하는 속성(Attribute)과 행위(Behavior)를 정의한 것
- 속성은 변수로, 행위는 메서드 형태로 선언한다.
- 객체 지향 프로그래밍에서 데이터를 추상화하는 단위로, 하나 이상의 유사한 객체들을 묶어 하나의 공통된 특성으로 표현한다.
- ex) 클래스(자동차) - 속성(금속 외관, 엔진, 바퀴 등) - 행위(이동)
- 클래스(Classes) 참고.
3. 메서드(Method)
- 클래스로부터 생성된 객체를 사용하는 방법
- ex) 시동을 건다 - 자동차라는 객체의 상태를 바꿈
- 한 객체의 서브루틴 형태로 객체의 속성을 조작하는데 사용됨
- 전통적으로 시스템의 함수(Function) 또는 프로시저(Procedure)에 해당하는 연산 기능이다.
4. 메시지(Message)
- 객체 간 상호 작용을 하기 위한 수단
- 메시지는 객체<->객체로 전달되며, 어떤 행위를 하도록 지시한다.
5. 인스턴스(Instance)
- 객체 지향 기법에서 클래스를 통해 만든 실제의 실형 객체
- 실제로 메모리에 할당 되는 객체이다.
- 클래스(Classes)#인스턴스 참고.
객체 지향 설계 5대 원칙 : SOLID
1. 단일 책임 원칙 (SRP : Single Responsibility Principle)
- 하나의 클래스는 하나의 목적을 위해서 생성되며, 클래스가 제공하는 모든 서비스는 하나의 책임을 수행하는 데 집중되어 있어야 한다.
- 하나의 메소드는 하나의 책임만 가져야 한다.
- ex)
자동차라는 클래스가비행기특성의 객체를 묶기 위해서 사용되선 안된다.
2. 개방 폐쇄 원칙 (OCP : Open-Closed Principle)
- 상속/확장은 Open하고, 변경은 Close 해야 하며, 즉 코드를 변경할 때는 직접 변경보다는 상속을 통해 변경해야 한다.
- 소프트웨어의 구성요소(컴포넌트, 클래스, 모듈, 함수)는 확장에 열려 있어야 하고, 변경에는 닫혀있어야 한다.
3. 리스코프 치환 원칙 (LSP : Liskov Subtitution Principle)
- 서브 타입(상속받은 하위 클래스)은 어디서나 자신의 기반 타입(상위 클래스)으로 교체할 수 있어야 한다.
- 같은 조상의 다른 클래스로 바꿔도 동작 되어야 한다.
4. 인터페이스 분리 원칙 (ISP : Interface Segregation Principle)
- 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 하며, 클라이언트가 사용하지 않는 인터페이스때문에 영향을 받아서는 안된다.
- 유사한 인터페이스가 있더라도 목적이 다르면 분리해야 한다.
5. 의존관계 역전 원칙 (DIP : Dependency Inversion Principle)
- 추상화에 의존한 코드를 작성해야 하며, 코드가 너무 구체적이면 변경하기 어렵다.
- 실제 사용 관계는 바뀌지 않으며, 추상을 매개로 메시지를 주고 받음으로써 관계를 최대한 느슨하게 만들어야 한다.
객체 지향 기법
- 객체 지향 프로그래밍에서 자료의 추상화를 기초로 하여 상속, 다형성, 동적 바인딩이 서로 맞물려 기능한다.
1. 캡슐화(Encapsulation)
- 참고 자료 : 위키백과 캡슐화
- 객체의 속성(data fields)과 행위(methods)를 하나로 묶어 외부와 경계를 만들고, 필요한 인터페이스만 외부에 노출시킨다.
- 결합도가 낮아지고 재사용이 용이해지며, 정보 은닉에 사용된다.
- 내부에 감추는 방법은 언어적 측면에서 접근지정자를 설정하여 해당 영역에 들어가는 속성이나 메서드를 제한한다.
2. 상속성(Inheritance)
- 상위 클래스의 속성과 메서드를 하위 클래스에서 재정의 없이 물려받아 사용하는 기법이다.
- 중복된 속성과 메서드를 제거할 수 있고, 재사용이 용이해진다.
- 상속(Inheritance) 참고.
3. 다형성(Polymorphism)
- 참고 자료 : 위키백과 다형성(컴퓨터 과학)
- 프로그램 언어의 각 요소(상수, 변수, 함수, 메서드 등)이 다양한 자료형에 속하는 것이 허가되는 성질이다.
- 반대되는 단형성(Monomorphism) 은 프로그램 언어의 각 요소가 한가지 형태만 가지는 성질이다.
| 종류 | 설명 |
|---|---|
| 오버로딩 | 매개변수의 유형과 개수를 다르게 하여 같은 이름의 메서드를 여러 개 가지는 기법 |
| 생성자 (Constructors)#메소드 오버로딩 | |
| 오버라이딩 | 상속관계에서 상위클래스가 상속해준 메소드의 내용을 다시 정의하여 메소드를 구현하는 기법 |
| 오버라이딩(Overriding) |
4. 추상화(Abstraction)
- 참고 자료 : 위키백과 추상화(컴퓨터 과학)
- 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것이다.
- 공통 성질을 추출하여 추상 클래스를 설정하는 기법이다.
- 종류는 과정 추상화, 자료 추상화, 제어 추상화가 있다.
- 제어 추상화 : 한 컴포넌트의 구현 세부내용과 내부 메서드를 다른 것들과 분리시켜 내부 로직을 숨기는 것이다.
- 제어 추상화가 없다면 간단한 덧셈 연산을 하는데도 각 숫자를 이진법으로 변환하고 정보를 저장해서 다시 불러오는 전체 과정을 프로그래머가 하나씩 지정해줘야 할지도 모른다.
- 제어 추상화를 통해 빠른 프로그래밍 설계와 구현이 가능하며, 에러 감소, 유지 보수 시 시간 단축 등 프로그래밍의 복잡성을 줄일 수 있다.
- 데이터 추상화 : 데이터 타입의 추상적인 속성과 그 구체적인 구현 세부 사항을 명확하게 분리하는 것이다.
- 추상적인 속성은 클라이언트 코드에서 볼 수 있는 데이터 타입 인터페이스이다.
- 구체적인 구현은 비공개로 유지되며 효율성을 향상시키기 위해 변경될 수 있으며, 이 변화는 추상적 동작에 영향을 주지 않기에 원칙적으로 클라이언트 코드에 아무런 영향을 주지 않아야 한다.
5. 정보 은닉(Information Hiding)
- 캡슐화를 통해 코드 내부 데이터와 메서드를 숨기고, 공개 인터페이스를 통해서만 접근이 가능하도록 하는 코드 보안 기술이다.
- 필요하지 않은 정보의 접근을 막아 한 모듈 또는 하부 시스템이 다른 모듈의 구현에 영향을 받지 않도록 한다.
- 이를 통해 모듈 사이의 독립성을 유지하는데 도움을 주고, 요구 사항 등의 변화에 따른 수정에 용이해진다.
6. 관계성(Relationship)
- 두 개 이상의 엔터티 형에서 데이터를 참조하는 관계를 나타내는 기법이다.
| 종류 | 설명 |
|---|---|
| 연관화 | 클래스와 객체의 참조 및 이용관계 같은 계층에 속하는 클래스들 사이의 상호 의존성을 보여주는 비계층적 관계성 |
| 집단화 | 서로 관련 있는 여러 개의 객체를 묶어 한 개의 상위 객체를 만듦 상위 클래스들의 성질들이 하위 클래스로 상속되지 않음 |
| 분류화 | 공통된 특성에 의해 정의된 객체 구성원들의 인스턴스 |
| 일반화 | 클래스들 간의 개념적인 포함 관계 상위 클래스의 특성을 하위 클래스가 상속받음 |
| 특수화 | 상위 클래스들의 특성들을 상속받으면서 하위 클래스에서 자기 자신의 고유한 특성을 가지는 관계 |